using Godot;
using System;
using System.Threading.Tasks;

public partial class InitiativeAIComponent : BaseAIComponent
{
    public override async void Run()
    {
        Cursor.FocusTarget(Self);
        await ToSignal(Cursor, nameof(Cursor.CameraMoveEnd));
        // 计算出移动范围
        var moveArea = MapManager.GetRobotMoveRange(Self);
        // 警戒范围 最小5 ， 最大为最大攻击范围
        var radius = Self.GetMaxAttackRange();
        // 搜索警戒范围内的敌人
        var list = RobotManager.FindEnemyByDistance(Self, Mathf.Max(radius, Global.MinGuardRadius));
        // GD.Print($"{Self.Name} 警戒范围内的敌人数量：{list.Count}");
        // 如果有敌人在警戒范围内
        if (list.Count > 0)
        {
            if (radius > Global.MinGuardRadius)
            {
                // GD.Print($"{Self.Name} 攻击范围内有敌人");
                // 攻击范围比警戒范围大时，直接获取攻击范围内的敌人进行攻击
                var dic = RobotManager.GetCanAttackEnemies(Self, list);
                if (dic.Count > 0)
                {
                    // 查找伤害最高或者能击打的敌人进行攻击
                    var damageList = CalculateDamage(dic, Self);
                    if (damageList.Count > 0)
                    {
                        var tarInfo = damageList[0];
                        // 进行攻击
                        await PlayBattleRecord(tarInfo.Attacker, tarInfo.Target, tarInfo.UsedWeapon);
                    }
                    else
                    {
                        // 正常应该不会进这里
                        GD.PushError("没有找到可以攻击的敌人 --- error line 39");
                    }
                }
                else
                {
                    // 正常应该不会进这里
                    GD.PushError("没有找到可以攻击的敌人 --- error line 45");
                }
            }
            else
            {
                // GD.Print($"{Self.Name} 警戒范围内有敌人，攻击范围内没有敌人");
                // 攻击范围内没有敌人 ， 但是警戒范围内有 , 则查找移动后可以攻击的敌人
                var dic = RobotManager.GetCanAttackEnemyAfterMove(Self, moveArea);
                // 如果有可以攻击的敌人
                if (dic.Count > 0)
                {
                    // 查找伤害最高或者能击打的敌人进行攻击
                    var damageList = CalculateDamage(dic, Self);
                    if (damageList.Count > 0)
                    {
                        var tarInfo = damageList[0];
                        // GD.Print($"{Self.Name} 移动后使用 {tarInfo.UsedWeapon.WeaponName} 攻击的敌人 {tarInfo.Target.Name}");
                        await MoveAndAttack(moveArea, tarInfo.Attacker, tarInfo.Target, tarInfo.UsedWeapon);
                    }
                    else
                    {
                        // 若是连移动后可以攻击的敌人也没有，则向敌人靠近
                        await MoveToNearEnemy(Self, moveArea);
                    }
                }
                else
                {
                    await MoveToNearEnemy(Self, moveArea);
                }
            }
        }
        else
        {
            // GD.Print($"{Self.Name} 警戒范围内没有敌人 , 向敌人移动");
            // 没有敌人在警戒范围内，向敌人靠近
            await MoveToNearEnemy(Self, moveArea);
        }
    }

}
